package com.hy.${packageCode}.shared.distribute;

import com.hy.${packageCode}.shared.distribute.cache.DistCache;
import com.hy.${packageCode}.shared.distribute.counter.DistCounter;
import com.hy.${packageCode}.shared.distribute.election.DistLeaderElection;
import com.hy.${packageCode}.shared.distribute.lock.DistLock;
import com.hy.${packageCode}.shared.distribute.lock.DistReadWriteLock;
import com.hy.${packageCode}.shared.distribute.map.DistMap;
import com.hy.${packageCode}.shared.distribute.rate.DistRateLimiter;
import com.hy.${packageCode}.shared.distribute.cache.DistCache;
import com.hy.${packageCode}.shared.distribute.counter.DistCounter;
import com.hy.${packageCode}.shared.distribute.election.DistLeaderElection;
import com.hy.${packageCode}.shared.distribute.lock.DistLock;
import com.hy.${packageCode}.shared.distribute.lock.DistReadWriteLock;
import com.hy.${packageCode}.shared.distribute.map.DistMap;
import com.hy.${packageCode}.shared.distribute.rate.DistRateLimiter;
import com.hy.${packageCode}.shared.distribute.cache.DistCache;
import com.hy.${packageCode}.shared.distribute.counter.DistCounter;
import com.hy.${packageCode}.shared.distribute.election.DistLeaderElection;
import com.hy.${packageCode}.shared.distribute.lock.DistLock;
import com.hy.${packageCode}.shared.distribute.lock.DistReadWriteLock;
import com.hy.${packageCode}.shared.distribute.map.DistMap;
import com.hy.${packageCode}.shared.distribute.rate.DistRateLimiter;

/**
 * 分布式对象工厂
 */
public interface DistObjectFactory {

    String id();

    /**
     * 关闭工厂，做清理
     */
    default void shutdown() {
    }

    /**
     * 获取 分布式 Java Map 对象， 默认带本地缓存
     *
     * @param name 对象名称
     * @param <K>  Map Key 类型
     * @param <V>  Map Value 类型
     * @return 分布式 Java Map 对象
     */
    default <K, V> DistMap<K, V> getMap(String name) {
        return getMap(name, true);
    }

    /**
     * 获取 分布式 Java Map 对象
     *
     * @param name          对象名称
     * @param witLocalCache 是否带本地缓存
     * @param <K>           Map Key 类型
     * @param <V>           Map Value 类型
     * @return 分布式 Java Map 对象
     */
    <K, V> DistMap<K, V> getMap(String name, boolean witLocalCache);

    /**
     * 获取分布式锁
     *
     * @param name 锁名称
     * @return 分布式锁
     */
    DistLock getLock(String name);

    /**
     * 获取分布式读写锁
     *
     * @param name 锁名称
     * @return 分布式读写锁
     */
    DistReadWriteLock getReadWriteLock(String name);

    /**
     * 获取分布式计数器
     *
     * @param name 计数器 名称
     * @return 分布式计数器
     */
    DistCounter getCounter(String name);

    /**
     * 获取分布式缓存(Java Map 对象)， 默认不带本地缓存
     *
     * @param name 缓存名称
     * @param <K>  Key 类型
     * @param <V>  Value 类型
     * @return 分布式缓存
     */
    default <K, V> DistCache<K, V> getCache(String name) {
        return getCache(name, false);
    }

    /**
     * 获取分布式缓存(Java Map 对象)
     *
     * @param name           缓存名称
     * @param withLocalCache 是否带本地缓存
     * @param <K>            Key 类型
     * @param <V>            Value 类型
     * @return 分布式缓存
     */
    <K, V> DistCache<K, V> getCache(String name, boolean withLocalCache);

    /**
     * 获取 Leader 选择器
     *
     * @param name leader 名称
     * @return Leader 选择器
     */
    DistLeaderElection getLeaderElection(String name);

    /**
     * 获取限流器
     *
     * @param name 限流器名称
     * @return 限流器
     */
    DistRateLimiter getRateLimiter(String name);
}
